home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sys / expand.c < prev    next >
Text File  |  1990-12-19  |  3KB  |  97 lines

  1.  
  2. /*
  3.  * @(#)expand.c 1.1 86/09/27
  4.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  5.  */
  6.  
  7. /*
  8.  * This routine expands a compressed-format font table into
  9.  * its working (uncompressed) form, for speed.
  10.  *
  11.  * Working font tables contain CHRHEIGHT-1 shorts per character,
  12.  * and 96 characters (starting from 0x20 -- space).  (The top and bottom
  13.  * lines of each character are 0, so we overlap the bottom of char 'x'
  14.  * with the top of char 'x+1' to make them fit.)  Of each short,
  15.  * only the top CHRWIDTH bits are used; the rest of the bits in the
  16.  * short must be zeros for Sun-2 software rasterops.
  17.  *
  18.  * Compressed font tables are in three pieces.
  19.  *
  20.  * The first piece is a bit vector where ones indicate that the current
  21.  * short (line of bits) is different than the previous one.  The vector
  22.  * is scanned from left to right and every time a 1-bit is encountered,
  23.  * the next short is picked up and used.  For each zero bit, the previous
  24.  * short is re-used.  There are  (CHRHEIGHT-2)*96  bits in the vector,
  25.  * because the working font table has size (CHRHEIGHT-1)*96 and we know
  26.  * that the first of those CHRHEIGHT-1 words per character is always zero.
  27.  *
  28.  * The third piece is a list of all of the combinations of bits
  29.  * that occur in the font.  Each one is CHRWIDTH bits wide.  There
  30.  * are no duplicated entries in this piece.
  31.  *
  32.  * The second part is an index which indicates, for each 1-bit in the
  33.  * first piece, which entry from the third piece it represents.
  34.  *
  35.  * A short example:
  36.  *
  37.  * 1st: 1 0 0 0 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0    (nineteen entries*1 bit)
  38.  * 2nd: 0         1       0     2 3 1           (six entries, 8 bit)
  39.  * 3rd: 0x000  0x0C0  0x487  0x48F         (four entries, 12 bit)
  40.  *
  41.  * This produces the working table: (19 entries, 16 bit w/4 bits padding)
  42.  *
  43.  *    0x0000    0x0000    0x0000    0x0000    0x0000
  44.  *    0x0C00     0x0C00    0x0C00    0x0C00
  45.  *    0x0000    0x0000    0x0000
  46.  *    0x4870
  47.  *    0x48F0
  48.  *    0x0C00    0x0C00    0x0C00    0x0C00    0x0C00
  49.  *
  50.  * (which is really a regular matrix of shorts, not a list of variable
  51.  * length vectors as it is depicted here.  The depiction is only to show
  52.  * how it was derived.  NOTE THAT THE ABOVE EXAMPLE DOESN'T DEMONSTRATE
  53.  * THAT EVERY 20 ENTRIES, WE INSERT A ZERO.)
  54.  */
  55.  
  56. /*
  57.     THIS CODE DEPENDS ON CHRWIDTH = 12.
  58. */
  59.  
  60.  
  61. fexpand(ptable, pbitmap, bitmaplen, pindex, pdata_hi, pdata_lo)
  62.     register unsigned short *ptable;
  63.     register unsigned char *pbitmap;
  64.     register unsigned char *pindex;
  65.     unsigned char *pdata_hi, *pdata_lo;
  66. {
  67.     register short i, j;
  68.     register unsigned short curshort;
  69.     register unsigned char bits;
  70.     register unsigned char index;
  71.     register unsigned char low;
  72.     char twenty = 20;
  73.     
  74.     *ptable++ = 0;
  75.     for (i = bitmaplen-1; i != -1; i--) {
  76.         bits = *pbitmap++;
  77.         for (j = 7; j != -1; j--) {
  78.             if (bits&0x80) {
  79.                 /* curshort = data[*pindex++]; */
  80. /* BEGIN SECTION THAT DEPENDS ON CHRWIDTH=12 */
  81.                 index = *pindex++;
  82.                 curshort = pdata_hi[index]<<8;
  83.                 low = pdata_lo[index>>1];
  84.                 curshort |= 0x00F0 & ((index&1)? low<<4: low);
  85.                 /* Low 4 bits are trash anyway */
  86. /* END SECTION THAT DEPENDS ON CHRWIDTH=12 */
  87.             }
  88.             *ptable++ = curshort;
  89.             if (!--twenty) {
  90.                 *ptable++ = 0;
  91.                 twenty = 20;
  92.             }
  93.             bits <<= 1;
  94.         }
  95.     }
  96. }
  97.